package geometrie;
/**
 * 
 * Cet class représente un Point en 3D (x,y,z).
 *
 */
public class Point {
	/**
	 * Les coordonnees d'un point 3D
	 */
	double xCartesien;
	double yCartesien;
	double zCartesien;
	/**
	 * Constructeur d'une point
	 * @param x Abscisse
	 * @param y Ordonnée 
	 * @param z hauteur
	 * 
	 * */
	public Point(double x, double y, double z) {
		this.xCartesien = x;
		this.yCartesien = y;
		this.zCartesien = z;
	}
	
	/**
	 * Constructeur d'un Point avec d'autre point
	 * @param p Point
	 */
	public Point(Point p){
		xCartesien = p.getXCartesien();
		yCartesien = p.getYCartesien();
		zCartesien = p.getZCartesien();		
	}
	/**
	 * COMPLETAR
	 */
	public Point(Matrice m){
		xCartesien = m.getAt(0, 0)/m.getAt(3, 0);
		yCartesien = m.getAt(1, 0)/m.getAt(3, 0);
		zCartesien = m.getAt(2, 0)/m.getAt(3, 0);
	}
	/**
	 * Obtenir la valeur de l'abscisse
	 * @return L'abscisse
	 */
	public double getXCartesien() {
		return xCartesien;
	}
	
	/**
	 * Obtenir la valeur de l'ordonnée
	 * @return L'ordonnée
	 */
	public double getYCartesien() {
		return yCartesien;
	}
	
	/**
	 * Obtenir la valeur de l'hauteur
	 * @return L'hauteur
	 */
	public double getZCartesien() {
		return zCartesien;
	}
	/**
	 * Modifier les coordonnées cartésiennes d'un point
	 * @param x Abscisse
	 * @param y Ordonnée 
	 * @param z hauteur
	 */
	public void set(double x, double y, double z) {
		this.xCartesien = x;
		this.yCartesien = y;
		this.zCartesien = z;
	}
	/**
	 * Get the coordonnees cartesiennes homogenes en forme de Matrice
	 * @return Matrice de cet Point en coordonnees homogenes
	 */
	public Matrice getMatriceHomogene(){
		Matrice m = new Matrice(4,1);
		m.setAt(0, 0, getXCartesien());
		m.setAt(1, 0, getYCartesien());
		m.setAt(2, 0, getZCartesien());
		m.setAt(3, 0, 1);
		return m;
	}
	/**
	 * Il calcule la distance entre Point a et Point b
	 * @param a Point a
	 * @param b Point b
	 * @return La distance
	 */
	public static double distance(Point a, Point b){
		double x,y,z;
		x=b.getXCartesien()-a.getXCartesien();
		y=b.getYCartesien()-a.getYCartesien();
		z=b.getZCartesien()-a.getZCartesien();
		return Math.sqrt(x*x+y*y+z*z);
	}
	
	/**
	 * Obtenir l'aire a partir de 3 points donnees
	 * @param p1 Point 1
	 * @param p2 Point 2
	 * @param p3 Point 3
	 * @return l'aire
	 */
	public static double getAire(Point p1, Point p2, Point p3){		
		double a = Point.distance(p1, p2);
		double b = Point.distance(p2,p3);
		double c = Point.distance(p1, p3);
		double semiP = (a + b + c) / 2;
		return Math.sqrt(semiP * (semiP - a)* (semiP - b)* (semiP - c)) ;				
	}
	/**
	 * Generer le toString() du Objet Point pour s'afficher
	 */
	public String toString(){
		return new String("x: " + xCartesien + ", y: " + yCartesien + ", z: " + zCartesien);
	}

}

